import axios, { AxiosResponse, AxiosRequestConfig } from 'axios'
import qs from 'qs'

/**
 * 业务自定义状态码
 * 1000 请求成功
 * 5000 重定向
 * 5002 重定向+提示(token获取失败)
 * 5003 cookie中缺失appKey
 * 5004 用户被拉入黑名单
 * 4003 未授权
 */

// axios声明合并，在axios的配置项AxiosRequestConfig接口定义中自定义新值
declare module 'axios' {
  export interface AxiosRequestConfig {
    /**
     * @description 设置为false，表示请求错误是用户自定义处理（true）还是全局处理（false）
     */
    customError?: boolean
  }
}

// 创建axios实例，此时的content-type已指定为json,如需使用form-data，请自行修改
const http = axios.create({
  timeout: 10000,
  headers: {
    'Content-Type': 'application/json;charset=UTF-8'
  },
  // 表示跨域请求时是否需要使用凭证
  withCredentials: true,

  validateStatus(status) {
    return status === 200 // 自定义状态码范围
  },
  paramsSerializer(params) {
    // 序列化请求参数，避免get请求参数出现[],&,空格等识别错误的问题
    return qs.stringify(params, { arrayFormat: 'brackets' })
  },
  transformRequest: [
    data => {
      // 转化为正常的json
      data = JSON.stringify(data)
      return data
    }
  ]
})
// 请求拦截
http.interceptors.request.use(
  (config: AxiosRequestConfig) => {
    // do something

    return config
  },
  (error: any) => {
    Promise.reject(error)
  }
)

// 响应拦截
http.interceptors.response.use(
  async (response: AxiosResponse) => {
    return Promise.reject(response)
  },
  (error: any) => {
    // do something
    return Promise.reject(error)
  }
)

export default http
